home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / spiele / workbench spiele / krsnake / src / actionreplay.e < prev    next >
Text File  |  1995-10-25  |  20KB  |  661 lines

  1. ->
  2. -> ANNVIT CÆPTIS MDCCLXXVI!
  3. ->
  4. ->    ActionReplay 1.7 stab
  5. ->
  6. -> $NSAREG: 23F11N07OR2748D5963.6 [Crassus]
  7. ->
  8. -> Copyright © 1995 Psilocybe Software
  9. ->
  10. -> This program is free software; you can redistribute it and/or modify
  11. -> it under the terms of the GNU General Public License as published by
  12. -> the Free Software Foundation; either version 2 of the License, or
  13. -> (at your option) any later version.
  14. ->
  15. -> This program is distributed in the hope that it will be useful,
  16. -> but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. -> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. -> GNU General Public License for more details.
  19. ->
  20. -> You should have received a copy of the GNU General Public License
  21. -> along with this program; if not, write to the Free Software
  22. -> Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23. ->
  24. -> $HISTORY:
  25. ->
  26. -> 23 Oct 1995 : 001.007 :  Uses krsnake graphics
  27. -> 13 Oct 1995 : 001.006 :  Added locale support
  28. -> 01 Oct 1995 : 001.005 :  Some small bugfixes
  29. -> 22 Sep 1995 : 001.004 :  Understands SNAKE_HIDE/SHOWINTERFACE
  30. -> 12 Sep 1995 : 001.003 :  Updated to use datatypes and new prefs
  31. -> 21 Aug 1995 : 001.002 :  Finished version, supports krsnake.library
  32. -> 11 Jul 1995 : 001.001 :  Initial release
  33. ->
  34. -> NOVUS ORDO SECLORUM!
  35. ->
  36.  
  37. OPT OSVERSION=37
  38.  
  39. MODULE 'intuition/intuition','intuition/screens','dos/dos','graphics/text'
  40. MODULE 'graphics/view','exec/lists','exec/nodes','exec/ports','graphics/gfx'
  41. MODULE 'libraries/krsnake','krsnake','*graphic'
  42. MODULE 'tools/trapguru','tools/exceptions','*tiledbitmap','*createpath'
  43. MODULE 'tools/cookrawkey','tools/ctype','locale','*krsnakecat'
  44.  
  45. RAISE   "SCR"   IF  LockPubScreen()=0,
  46.         "WIN"   IF  OpenWindowTagList()=0,
  47.         "DRI"   IF  GetScreenDrawInfo()=0,
  48.         "FONT"  IF  OpenFont()=0
  49.  
  50. OBJECT event
  51.     next:PTR TO event
  52.     event:LONG
  53.     data:LONG
  54. ENDOBJECT
  55.  
  56. DEF krc=0
  57. DEF w=0:PTR TO window,s=0:PTR TO screen,dri=0:PTR TO drawinfo
  58. DEF font:PTR TO textfont,dripens[NUMDRIPENS]:ARRAY OF INT
  59. DEF bw=3,bh=3,fw=128,fh=128,fy,gy,ww,wh,wx=0,wy=-1,th
  60. DEF chunk=0,hx=15,hy=15,sx=0,sy=-1,eaten=0,playing=0,cx=-1,cy=-1,speed=3
  61. DEF fifox[1024]:ARRAY OF INT,fifoy[1024]:ARRAY OF INT,fifos=0,fifoe=1,fifol=2
  62. DEF matrix[1024]:ARRAY OF INT,killtask=FALSE,gameover=0
  63. DEF fillp[7]:ARRAY OF LONG,datatype[7]:ARRAY OF LONG,cp=0,paused=0
  64. DEF wantobtainpens=0,pensobtained=0,graphic[7]:ARRAY OF LONG
  65. DEF cstr=0,kp=0:PTR TO kprefs,firstevent=0:PTR TO event,lastevent=0:PTR TO event
  66. DEF visible=0,head=3
  67.  
  68. PROC obtainpen(a)
  69.     SELECT 4 OF kp.fill[a].type
  70.         CASE FILLTYPE_RGB
  71.             fillp[a]:=ObtainBestPenA(s.viewport.colormap,v32(kp.fill[a].red),v32(kp.fill[a].green),v32(kp.fill[a].blue),[OBP_PRECISION,PRECISION_EXACT,NIL])
  72.         CASE FILLTYPE_DATATYPE
  73.             datatype[a]:=createImageData(kp.fill[a].file,s)
  74.         CASE FILLTYPE_GRAPHIC
  75.             graphic[a]:=loadGraphic(kp.fill[a].file,s)
  76.     ENDSELECT
  77. ENDPROC
  78.  
  79. PROC scaleGraphics()
  80.     DEF i
  81.     FOR i:=0 TO 6
  82.         IF kp.fill[i].type=FILLTYPE_GRAPHIC THEN scaleGraphic(graphic[i],bw,bh,s)
  83.     ENDFOR
  84. ENDPROC
  85.  
  86. PROC v32(x) IS Or(Shl(x,24),Or(Shl(x,16),Or(Shl(x,8),x)))
  87.  
  88. PROC obtainpens()
  89.     DEF gfxver,a
  90.     MOVE.L  gfxbase,A0
  91.     MOVE.W  20(A0),gfxver
  92.     IF gfxver>=39
  93.         pensobtained:=1
  94.         FOR a:=0 TO 6 DO obtainpen(a)
  95.     ENDIF
  96. ENDPROC
  97.  
  98. PROC freepens()
  99.     DEF a
  100.     FOR a:=0 TO 6
  101.         SELECT 4 OF kp.fill[a].type
  102.             CASE FILLTYPE_RGB
  103.                 IF fillp[a]<>-1 THEN ReleasePen(s.viewport::viewport.colormap,fillp[a])
  104.             CASE FILLTYPE_DATATYPE
  105.                 IF datatype[a] THEN disposeImageData(datatype[a])
  106.             CASE FILLTYPE_GRAPHIC
  107.                 IF graphic[a] THEN freeGraphic(graphic[a])
  108.         ENDSELECT
  109.     ENDFOR
  110. ENDPROC
  111.  
  112. PROC dumpsettings() HANDLE
  113.     DEF f=0
  114.     createPath('ENVARC:KRSNAke/urk')
  115.     f:=Open('ENVARC:KRSNAke/ActionReplay.snapshot',MODE_NEWFILE)
  116.     IF f=0 THEN Raise("URK")
  117.     VfPrintf(f,'%ld\n%ld\n%ld\n%ld\n%ld\n',[wx,wy,bw,bh,speed])
  118. EXCEPT DO
  119.     IF f THEN Close(f)
  120. ENDPROC
  121.  
  122. PROC readnumeral(f)
  123.     DEF i,b[256]:ARRAY OF CHAR
  124.     IF (Fgets(f,b,255)=0) THEN Raise("URK")
  125.     i:=Val(b)
  126. ENDPROC i
  127.  
  128. PROC readsettings()
  129.     DEF f=0
  130.     kp:=KsReadKRSNAkePrefs()
  131.     IF kp=0 THEN Raise("Pref")
  132.     wantobtainpens:=TRUE
  133.     IF (f:=Open('ENVARC:KRSNAke/ActionReplay.snapshot',MODE_OLDFILE))
  134.         wx:=readnumeral(f)
  135.         wy:=readnumeral(f)
  136.         bw:=readnumeral(f)
  137.         fw:=bw*32
  138.         bh:=readnumeral(f)
  139.         fh:=bh*32
  140.         speed:=readnumeral(f)
  141.         Close(f)
  142.     ENDIF
  143. ENDPROC
  144.  
  145. PROC bevelbox(x1,y1,x2,y2,dir=TRUE,bf=0)
  146.     DEF shine,shadow
  147.     IF dir
  148.         shine:=dripens[SHINEPEN]
  149.         shadow:=dripens[SHADOWPEN]
  150.     ELSE
  151.         shine:=dripens[SHADOWPEN]
  152.         shadow:=dripens[SHINEPEN]
  153.     ENDIF
  154.     SetAPen(stdrast,shine)
  155.     RectFill(stdrast,x1,y1,x1,y2)
  156.     RectFill(stdrast,x1+1,y1,x2-1,y1)
  157.     SetAPen(stdrast,shadow)
  158.     RectFill(stdrast,x1+1,y2,x2,y2)
  159.     RectFill(stdrast,x2,y1,x2,y2-1)
  160.     IF bf
  161.         SetAPen(stdrast,bf)
  162.         RectFill(stdrast,x1+1,y1+1,x2-1,y2-1)
  163.     ENDIF
  164. ENDPROC
  165.  
  166. PROC renderlink(x,y,p)
  167.     DEF sx,sy,a
  168.     sx:=(x*bw)+4
  169.     sy:=(y*bh)+fy
  170.     IF kp.fill[p].type<>FILLTYPE_GRAPHIC
  171.         IF p>FILL_BACK
  172.             bevelbox(sx,sy,sx+bw-1,sy+bh-1,TRUE)
  173.             renderfill(sx+1,sy+1,sx+bw-2,sy+bh-2,p)
  174.         ELSE
  175.             renderfill(sx,sy,sx+bw-1,sy+bh-1,FILL_BACK)
  176.         ENDIF
  177.     ELSE
  178.         IF p<FILL_FRUIT1 THEN a:=matrix[(y*32)+x]-1 ELSE a:=0
  179.         drawGraphic(stdrast,graphic[p],a,sx,sy)
  180.     ENDIF
  181. ENDPROC
  182.  
  183. PROC renderfill(x1,y1,x2,y2,p)
  184.     DEF r:rectangle,d:PTR TO imagedata
  185.     SELECT 4 OF kp.fill[p].type
  186.         CASE FILLTYPE_RGB,FILLTYPE_GRAPHIC
  187.             SetAPen(stdrast,fillp[p])
  188.             RectFill(stdrast,x1,y1,x2,y2)
  189.         CASE FILLTYPE_DRIPEN
  190.             SetAPen(stdrast,dripens[kp.fill[p].dripen])
  191.             RectFill(stdrast,x1,y1,x2,y2)
  192.         CASE FILLTYPE_DATATYPE
  193.             d:=datatype[p]
  194.             r.minx:=x1
  195.             r.maxx:=x2
  196.             r.miny:=y1
  197.             r.maxy:=y2
  198.             copyTiledBitMap(d,stdrast,r)
  199.     ENDSELECT
  200. ENDPROC
  201.  
  202. PROC rendersnake()
  203.     DEF i,p
  204.     renderfill(4,fy,fw+3,fh+fy-1,FILL_BACK)
  205.     i:=fifol
  206.     p:=fifos
  207.     REPEAT
  208.         IF i>1
  209.             renderlink(fifox[p],fifoy[p],FILL_LINK)
  210.         ELSE
  211.             renderlink(fifox[p],fifoy[p],FILL_HEAD)
  212.         ENDIF
  213.         p:=p+1
  214.         IF p>=1024 THEN p:=0
  215.         i:=i-1
  216.     UNTIL i=0
  217.     IF (cx>=0) AND (cy>=0) THEN renderlink(cx,cy,FILL_FRUIT+cp)
  218. ENDPROC
  219.  
  220. PROC pushlink(data)
  221.     DEF x,y
  222.     x:=And(data,$FF)
  223.     y:=And(Shr(data,8),$FF)
  224.     fifoe:=fifoe+1
  225.     fifol:=fifol+1
  226.     IF fifoe>=1024 THEN fifoe:=0
  227.     fifox[fifoe]:=x
  228.     fifoy[fifoe]:=y
  229.     matrix[(y*32)+x]:=head
  230. ENDPROC
  231.  
  232. PROC poplink()
  233.     DEF x,y
  234.     x:=fifox[fifos]
  235.     y:=fifoy[fifos]
  236.     fifos:=fifos+1
  237.     fifol:=fifol-1
  238.     IF fifos>=1024 THEN fifos:=0
  239.     matrix[(y*32)+x]:=0
  240. ENDPROC x,y
  241.  
  242. PROC renderstatus(str=0:PTR TO CHAR,redraw=TRUE)
  243.     DEF sw
  244.     IF str THEN cstr:=str
  245.     IF visible
  246.         IF redraw
  247.             SetAPen(stdrast,dripens[BACKGROUNDPEN])
  248.             RectFill(stdrast,1,gy+2,ww-2,gy+th+1)
  249.         ENDIF
  250.         IF cstr
  251.             sw:=TextLength(stdrast,cstr,StrLen(cstr))
  252.             SetAPen(stdrast,dripens[TEXTPEN])
  253.             Move(stdrast,(ww-sw)/2,gy+3+font.baseline)
  254.             Text(stdrast,cstr,StrLen(cstr))
  255.         ENDIF
  256.     ENDIF
  257. ENDPROC
  258.  
  259. PROC render()
  260.     DEF rw,rh
  261.     ww:=w.width-w.borderleft-w.borderright
  262.     wh:=w.height-w.bordertop-w.borderbottom
  263.     fw:=ww-8
  264.     fh:=wh-th-14
  265.     fy:=4
  266.     gy:=fh+8
  267.     bw:=fw/32
  268.     bh:=fh/32
  269.     rw:=bw*32
  270.     rh:=bh*32
  271.     IF (fw-rw) OR (fh-rh) THEN JUMP done
  272.  
  273.     scaleGraphics()
  274.     SetRast(stdrast,dripens[BACKGROUNDPEN])
  275.     bevelbox(0,gy,ww-1,gy+th+5)
  276.     bevelbox(0,0,ww-1,gy-1)
  277.     bevelbox(3,3,ww-4,gy-4,FALSE)
  278.     renderstatus()
  279.     rendersnake()
  280. done:
  281. ENDPROC
  282.  
  283. PROC verifysize()
  284.     DEF rw,rh,aw,ah
  285.     aw:=w.width
  286.     ah:=w.height
  287.     fw:=aw-w.borderleft-w.borderright-8
  288.     fh:=ah-w.bordertop-w.borderbottom-th-14
  289.     bw:=fw/32
  290.     bh:=fh/32
  291.     rw:=bw*32
  292.     rh:=bh*32
  293.     IF (fw-rw) OR (fh-rh)
  294.         aw:=aw-(fw-rw)
  295.         ah:=ah-(fh-rh)
  296.         ChangeWindowBox(w,w.leftedge,w.topedge,aw,ah)
  297.     ENDIF
  298. ENDPROC
  299.  
  300. PROC transformhead(x,y,h)
  301.     DEF p,nh
  302.     p:=(y*32)+x
  303.     nh:=matrix[p]
  304.     SELECT nh
  305.         CASE 5
  306.             SELECT h
  307.                 CASE 5
  308.                     matrix[p]:=1
  309.                 CASE 6
  310.                     matrix[p]:=15
  311.                 CASE 8
  312.                     matrix[p]:=16
  313.             ENDSELECT
  314.         CASE 6
  315.             SELECT h
  316.                 CASE 5
  317.                     matrix[p]:=14
  318.                 CASE 6
  319.                     matrix[p]:=2
  320.                 CASE 7
  321.                     matrix[p]:=20
  322.             ENDSELECT
  323.         CASE 7
  324.             SELECT h
  325.                 CASE 6
  326.                     matrix[p]:=17
  327.                 CASE 7
  328.                     matrix[p]:=3
  329.                 CASE 8
  330.                     matrix[p]:=18
  331.             ENDSELECT
  332.         CASE 8
  333.             SELECT h
  334.                 CASE 5
  335.                     matrix[p]:=13
  336.                 CASE 7
  337.                     matrix[p]:=19
  338.                 CASE 8
  339.                     matrix[p]:=4
  340.             ENDSELECT
  341.     ENDSELECT
  342. ENDPROC
  343.  
  344. PROC transformtail(x,y)
  345.     DEF p,h
  346.     p:=(y*32)+x
  347.     h:=matrix[p]
  348.     SELECT 21 OF h
  349.         CASE 1,5,13,14
  350.             matrix[p]:=9
  351.         CASE 2,6,15,17
  352.             matrix[p]:=10
  353.         CASE 3,7,19,20
  354.             matrix[p]:=11
  355.         CASE 4,8,16,18
  356.             matrix[p]:=12
  357.     ENDSELECT
  358. ENDPROC
  359.  
  360. PROC newchunk(data)
  361.     cx:=And(data,$FF)
  362.     cy:=And(Shr(data,8),$FF)
  363.     chunk:=And(Shr(data,24),$FF)
  364.     cp:=And(Shr(data,16),$FF)
  365.     renderlink(cx,cy,FILL_FRUIT+cp)
  366. ENDPROC
  367.  
  368. PROC resetgame()
  369.     DEF i
  370.     FOR i:=0 TO 1023 DO matrix[i]:=0
  371.     playing:=1
  372.     fifos:=0
  373.     fifoe:=1
  374.     fifol:=2
  375.     fifox[0]:=15
  376.     fifoy[0]:=16
  377.     fifox[1]:=15
  378.     fifoy[1]:=15
  379.     matrix[(15*32)+15]:=8
  380.     matrix[(16*32)+15]:=12
  381.     head:=8
  382.     sx:=0
  383.     sy:=-1
  384.     chunk:=0
  385.     eaten:=0
  386.     hx:=15
  387.     hy:=15
  388.     cx:=-1
  389.     cy:=-1
  390.     gameover:=0
  391.     paused:=0
  392.     IF visible THEN render()
  393. ENDPROC
  394.  
  395. PROC newevent(event,data)
  396.     DEF e:PTR TO event
  397.     NEW e
  398.     e.event:=event
  399.     e.data:=data
  400.     IF lastevent THEN lastevent.next:=e
  401.     lastevent:=e
  402.     IF firstevent=0 THEN firstevent:=e
  403. ENDPROC
  404.  
  405. PROC flushevents()
  406.     DEF e:PTR TO event,u:PTR TO event
  407.     e:=firstevent
  408.     WHILE e
  409.         u:=e
  410.         e:=e.next
  411.         END u
  412.     ENDWHILE
  413.     firstevent:=0
  414.     lastevent:=0
  415. ENDPROC
  416.  
  417. PROC openKRSNAkeLib()
  418.     DEF base=0
  419.     base:=OldOpenLibrary('krsnake.library')
  420.     IF base=0 THEN OldOpenLibrary('Libs/krsnake.library')
  421.     IF base=0 THEN OldOpenLibrary('PROGDIR:Libs/krsnake.library')
  422.     IF base=0 THEN OldOpenLibrary('/Libs/krsnake.library')
  423.     IF base=0 THEN OldOpenLibrary('PROGDIR:/Libs/krsnake.library')
  424.     IF base=0 THEN Raise("klib")
  425. ENDPROC base
  426.  
  427. PROC speedcheck(char)
  428.     IF (char>="1") AND (char<="9") THEN speed:=char-"0"
  429. ENDPROC
  430.  
  431. PROC replaySequence()
  432.     DEF msg:PTR TO intuimessage,e:PTR TO event,x,y,icl,ico,iqu,iad,ct
  433.     resetgame()
  434.     renderstatus(getstr(REPLAYID_STOP),TRUE)
  435.     e:=firstevent
  436.     WHILE e
  437.         WHILE e.event=SNAKE_NEWCHUNK
  438.             newchunk(e.data)
  439.             e:=e.next
  440.             IF e=0 THEN RETURN FALSE
  441.         ENDWHILE
  442.         IF e.event=SNAKE_MOVES
  443.             head:=And(Shr(e.data,16),$FF)
  444.             transformhead(fifox[fifoe],fifoy[fifoe],head)
  445.             IF kp.fill[FILL_LINK].type=FILLTYPE_GRAPHIC THEN renderlink(fifox[fifoe],fifoy[fifoe],FILL_BACK)
  446.             renderlink(fifox[fifoe],fifoy[fifoe],FILL_LINK)
  447.             pushlink(e.data)
  448.             renderlink(fifox[fifoe],fifoy[fifoe],FILL_HEAD)
  449.             IF (fifox[fifoe]=cx) AND (fifoy[fifoe]=cy) THEN eaten:=eaten+chunk
  450.             IF eaten
  451.                 eaten:=eaten-1
  452.             ELSE
  453.                 x,y:=poplink()
  454.                 renderlink(x,y,FILL_BACK)
  455.                 transformtail(fifox[fifos],fifoy[fifos])
  456.                 IF kp.fill[FILL_LINK].type=FILLTYPE_GRAPHIC THEN renderlink(fifox[fifos],fifoy[fifos],FILL_BACK)
  457.                 renderlink(fifox[fifos],fifoy[fifos],FILL_LINK)
  458.             ENDIF
  459.             ct:=speed
  460.             WHILE ct
  461.                 DEC ct
  462.                 WaitTOF()
  463.             ENDWHILE
  464.         ENDIF
  465.         WHILE (msg:=GetMsg(w.userport))
  466.             icl:=msg.class
  467.             ico:=msg.code
  468.             iqu:=msg.qualifier
  469.             iad:=msg.iaddress
  470.             ReplyMsg(msg)
  471.             SELECT icl
  472.                 CASE IDCMP_CLOSEWINDOW
  473.                     RETURN TRUE
  474.                 CASE IDCMP_REFRESHWINDOW
  475.                     render()
  476.                 CASE IDCMP_NEWSIZE
  477.                     verifysize()
  478.                     render()
  479.                 CASE IDCMP_RAWKEY
  480.                     IF ico=$45 THEN RETURN TRUE
  481.                     ico:=tolower(cookRawkey(ico,iqu,iad))
  482.                     speedcheck(ico)
  483.                     SELECT ico
  484.                         CASE " "
  485.                             RETURN FALSE
  486.                     ENDSELECT
  487.             ENDSELECT
  488.         ENDWHILE
  489.         e:=e.next
  490.     ENDWHILE
  491. ENDPROC FALSE
  492.  
  493. PROC appear()
  494.     IF visible=0
  495.         visible:=1
  496.         IF StrLen(kp.pubscreen)
  497.             s:=LockPubScreen(kp.pubscreen)
  498.         ELSE
  499.             s:=LockPubScreen(NIL)
  500.         ENDIF
  501.         font:=OpenFont(s.font)
  502.         dri:=GetScreenDrawInfo(s)
  503.         dripens:=dri.pens
  504.         th:=font.ysize
  505.         IF wy=-1 THEN wy:=s.barheight+1
  506.         ww:=fw+8
  507.         wh:=fh+th+14
  508.         obtainpens()
  509.         w:=OpenWindowTagList(NIL,[WA_INNERWIDTH,ww,WA_INNERHEIGHT,wh,
  510.                                   WA_LEFT,wx,WA_TOP,wy,
  511.                                   WA_TITLE,'ActionReplay v1.7',
  512.                                   WA_SIZEGADGET,TRUE,
  513.                                   WA_DRAGBAR,TRUE,
  514.                                   WA_DEPTHGADGET,TRUE,
  515.                                   WA_CLOSEGADGET,TRUE,
  516.                                   WA_ACTIVATE,FALSE,
  517.                                   WA_SMARTREFRESH,TRUE,
  518.                                   WA_SIZEBBOTTOM,TRUE,
  519.                                   WA_GIMMEZEROZERO,TRUE,
  520.                                   WA_NEWLOOKMENUS,TRUE,
  521.                                   WA_SCREENTITLE,'KRSNAke ActionReplay v1.7',
  522.                                   WA_AUTOADJUST,TRUE,
  523.                                   WA_PUBSCREEN,s,
  524.                                   WA_RMBTRAP,TRUE,
  525.                                   WA_IDCMP,IDCMP_CLOSEWINDOW OR IDCMP_REFRESHWINDOW OR IDCMP_NEWSIZE OR IDCMP_RAWKEY OR IDCMP_GADGETUP,
  526.                                   NIL])
  527.         WindowLimits(w,w.borderleft+w.borderright+104,w.bordertop+w.borderbottom+th+110,-1,-1)
  528.         SetStdRast(w.rport)
  529.         SetFont(stdrast,font)
  530.         render()
  531.     ENDIF
  532. ENDPROC
  533.  
  534. PROC vanish()
  535.     IF visible
  536.         wx:=w.leftedge;wy:=w.topedge
  537.         IF w THEN CloseWindow(w)
  538.         IF pensobtained THEN freepens()
  539.         IF dri THEN FreeScreenDrawInfo(s,dri)
  540.         IF font THEN CloseFont(font)
  541.         IF s THEN UnlockPubScreen(NIL,s)
  542.         w:=0;pensobtained:=0;dri:=0;font:=0;s:=0;visible:=0
  543.     ENDIF
  544. ENDPROC
  545.  
  546. PROC main() HANDLE
  547.     DEF icl,ico,iqu,iad,mask,sig,msg:PTR TO intuimessage,x,y
  548.     trapguru()
  549.     warmupRawkeyCooker()
  550.     krsnakebase:=openKRSNAkeLib()
  551.     datatypesbase:=OpenLibrary('datatypes.library',39)
  552.     localebase:=OpenLibrary('locale.library',37)
  553.     openCatalog()
  554.     fifox[0]:=15
  555.     fifoy[0]:=15
  556.     readsettings()
  557.     SetTaskPri(FindTask(NIL),kp.priority)
  558.     resetgame()
  559.     playing:=0
  560.     krc:=KsRegisterClient()
  561.     renderstatus(getstr(REPLAYID_NOGAME),TRUE)
  562.  
  563.     REPEAT
  564.         IF visible
  565.             mask:=Shl(1,KsGetClientSig(krc)) OR Shl(1,w.userport::mp.sigbit)
  566.         ELSE
  567.             mask:=Shl(1,KsGetClientSig(krc))
  568.         ENDIF
  569.         sig:=Wait(mask)
  570.         IF And(sig,Shl(1,KsGetClientSig(krc)))
  571.             WHILE KsReadEvent(krc,{icl},{ico})
  572.                 SELECT icl
  573.                     CASE SNAKE_QUIT
  574.                         killtask:=TRUE
  575.                     CASE SNAKE_NEWGAME
  576.                         flushevents()
  577.                         resetgame()
  578.                         renderstatus(getstr(REPLAYID_RECORDING),TRUE)
  579.                     CASE SNAKE_PAUSED
  580.                         renderstatus(getstr(REPLAYID_PAUSED),TRUE)
  581.                     CASE SNAKE_RESTARTED
  582.                         renderstatus(getstr(REPLAYID_RECORDING),TRUE)
  583.                     CASE SNAKE_GAMEOVER
  584.                         renderstatus(getstr(REPLAYID_FINISHED),TRUE)
  585.                     CASE SNAKE_MOVES
  586.                         newevent(icl,ico)
  587.                         head:=And(Shr(ico,16),$FF)
  588.                         transformhead(fifox[fifoe],fifoy[fifoe],head)
  589.                         IF kp.fill[FILL_LINK].type=FILLTYPE_GRAPHIC THEN renderlink(fifox[fifoe],fifoy[fifoe],FILL_BACK)
  590.                         renderlink(fifox[fifoe],fifoy[fifoe],FILL_LINK)
  591.                         pushlink(ico)
  592.                         renderlink(fifox[fifoe],fifoy[fifoe],FILL_HEAD)
  593.                         IF (fifox[fifoe]=cx) AND (fifoy[fifoe]=cy) THEN eaten:=eaten+chunk
  594.                         IF eaten
  595.                             eaten:=eaten-1
  596.                         ELSE
  597.                             x,y:=poplink()
  598.                             renderlink(x,y,FILL_BACK)
  599.                             transformtail(fifox[fifos],fifoy[fifos])
  600.                             IF kp.fill[FILL_LINK].type=FILLTYPE_GRAPHIC THEN renderlink(fifox[fifos],fifoy[fifos],FILL_BACK)
  601.                             renderlink(fifox[fifos],fifoy[fifos],FILL_LINK)
  602.                         ENDIF
  603.                     CASE SNAKE_NEWCHUNK
  604.                         newevent(icl,ico)
  605.                         newchunk(ico)
  606.                     CASE SNAKE_SHOWINTERFACE
  607.                         appear()
  608.                     CASE SNAKE_HIDEINTERFACE
  609.                         vanish()
  610.                 ENDSELECT
  611.             ENDWHILE
  612.         ENDIF
  613.         IF visible
  614.             IF And(sig,Shl(1,w.userport::mp.sigbit))
  615.                 WHILE (msg:=GetMsg(w.userport))
  616.                     icl:=msg.class
  617.                     ico:=msg.code
  618.                     iqu:=msg.qualifier
  619.                     iad:=msg.iaddress
  620.                     ReplyMsg(msg)
  621.                     SELECT icl
  622.                         CASE IDCMP_CLOSEWINDOW
  623.                             killtask:=TRUE
  624.                         CASE IDCMP_REFRESHWINDOW
  625.                             render()
  626.                         CASE IDCMP_NEWSIZE
  627.                             verifysize()
  628.                             render()
  629.                         CASE IDCMP_RAWKEY
  630.                             IF ico=$45 THEN killtask:=TRUE
  631.                             ico:=tolower(cookRawkey(ico,iqu,iad))
  632.                             speedcheck(ico)
  633.                             SELECT ico
  634.                                 CASE "r"
  635.                                     killtask:=replaySequence()
  636.                                     renderstatus(getstr(REPLAYID_FINISHED),TRUE)
  637.                             ENDSELECT
  638.                     ENDSELECT
  639.                 ENDWHILE
  640.             ENDIF
  641.         ENDIF
  642.     UNTIL killtask
  643.  
  644.     vanish()
  645.     dumpsettings()
  646.  
  647. EXCEPT DO
  648.     IF krc THEN KsRemoveClient(krc)
  649.     IF kp THEN FreeVec(kp)
  650.     vanish()
  651.     closeCatalog()
  652.     IF datatypesbase THEN CloseLibrary(datatypesbase)
  653.     IF localebase THEN CloseLibrary(localebase)
  654.     IF krsnakebase THEN CloseLibrary(krsnakebase)
  655.     shutdownRawkeyCooker()
  656.     IF exception THEN IF exception="krsX" THEN PrintF(getstr(ERRORID_NOKRSNAKE)) ELSE report_exception()
  657. ENDPROC
  658.  
  659. CHAR '$VER: ActionReplay 1.007 (23 Oct 1995) stable beta test version'
  660.  
  661.